Ordinary
About

JPA Date Auditing

profileordilov / 2022. 1. 31

데이터베이스 타입 정하기

먼저 Auditing이 저장할 날짜의 데이터 타입을 정해야 합니다.
MySQL을 기준으로 정하겠습니다.
JPA DDL 생성을 이용하면 기본으로 DATETIME 으로 지정되고 설정으로 바꿀 수 있습니다.

MySQL Date Type

| Data Type | Value | |-----------|-----------------------| | DATE | '0000-00-00' | | TIME | '00:00:00' | | DATETIME | '0000-00-00 00:00:00' | | TIMESTAMP | '0000-00-00 00:00:00' | | YEAR | 0000 |

DATE, TIME, YEAR 은 각각 보듯이 시간, 날짜, 년도에 따라 구분되어 있습니다.
DATETIME 과 TIMESTAMP 는 형식이 같은데 어떤 차이점이 있을까요?

DATETIME

  • '1000-01-01 00:00:00.000000' ~ '9999-12-31 23:59:59.999999' 까지의 범위를 가집니다.
  • 타임존에 상관 없이 그대로 저장됩니다.

TIMESTAMP

  • '1970-01-01 00:00:01.000000' ~ '2038-01-19 03:14:07.999999' 까지의 범위를 가집니다.
  • 타임존 설정에 따라 바뀌어서 저장됩니다.

차이점

둘의 가장 큰 차이점은 설정한 타임존에 따라 시간이 설정된다는 점입니다. 따라서 위치에 상관없이 시간을 그대로 저장하고 싶다면 DATETIME을, 아니라면 TIMESTAMP로 설정합니다.

자바 타입 정하기

자바에서 지원하는 날짜 타입으로 Date, Timestamp, Instant, LocalDateTime, ZonedDateTime 등이 있습니다. 자바 8 이상이라면 Date나 TimeStamp 대신 조건에 맞는 날짜 타입을 쓰는 것이 좋습니다.
위에서 DATETIME처럼 시간대 구분 없이 사용할 때는 LocalDateTime을 사용합니다.
TIMESTAMP 처럼 시간대 구분이 필요할 때는 ZonedDateTime을 사용합니다.
다른 시간대 말고 무조건 UTC 기준으로 사용할 때 Instatnt을 사용합니다.

JPA Auditing 설정하기

Spring 전체에서 audit 기능을 사용하려면 @EnableJpaAuditing 어노테이션을 추가해줍니다.

@Configuration @EnableJpaAuditing class Config { ...

혹은 엔티티 별로 사용하고 싶다면 엔티티에 @EntityListeners 어노테이션을 추가해주면 됩니다.

@Entity @EntityListeners(AuditingEntityListener.class) public class MyEntity { }

그리고 Auditing을 설정할 필드에 어노테이션을 추가해줍니다.

class Customer { @CreatedDate private Instant createdDate; ... @CreationTimeStamp private ZonedDateTime createdAt; }

JPA 에서 제공하는 어노테이션 @CreatedDate 는 Instant, LocalDateTime, Date, DateTime 등에 사용 가능합니다. 하지만 ZonedDateTime 의 경우 사용할 수 없습니다. ZonedDateTime 을 사용하고 싶다면 hibernate에서 제공하는 어노테이션인 @CreationTimeStamp 을 사용하면 됩니다.